package com.algorithm.cn.queue;

import java.util.Scanner;

/**
 * 
* @author wangzonghui
* @date 2020年12月17日 下午9:51:11 
* @Description: 数组实现队列
 */
public class ArrayQueueDemo {

	public static void main(String[] args) {
		//测试数组队列
		ArrayQueue queue= new ArrayQueue(3);
		char key=' '; //接收用户输入
		Scanner scanner=new Scanner(System.in);
		boolean loop=true;
		while(loop) {
			System.out.println("s(show):显示队列");
			System.out.println("e(exit):退出队列");
			System.out.println("a(add):添加队列");
			System.out.println("g(get):取数据队列");
			System.out.println("h(head):查看头队列");
			
			key=scanner.next().charAt(0);
			switch(key) {
				case 's':
					queue.showQueue();
					break;
				case 'a':
					System.out.println("请输入一个数");
					int  value=scanner.nextInt();
					queue.addQueue(value);
					break;
				case 'g':
					try {
						int res=queue.getQueue();
						System.out.println("取出数据为:"+res);
					} catch (Exception e) {
						System.out.println(e.getMessage());
					}
				break;
				case 'h':
					try {
						int res=queue.headQueue();
						System.out.println("队列头数据为:"+res);
					} catch (Exception e) {
						System.out.println(e.getMessage());
					}
					break;
				
				case 'e':
					scanner.close();
					loop=false;
					break;
				default:
					break;
					
			}
		}
		System.out.println("程序退出");
		
	}
}

//使用数组模拟队列
class ArrayQueue{
	private int maxSize;  //表示数组最大容量
	private int front;  //队列头
	private int rear;  //队列尾部
	private int[] arr; //该数组用于存放数据
	
	
	//创建队列构造器
	public ArrayQueue(int arrMaxSize) {
		this.maxSize=arrMaxSize;
		arr=new int[maxSize];
		front=-1; //指向队列头
		rear=-1;  //指向队列尾部
	}
	/**
	 * 判断队列是否满
	 * @return
	 */
	public boolean isFull() {
		return rear==maxSize-1;
	}
	
	/**
	 * 判断队列是否为空
	 * @return
	 */
	public boolean isEmpty() {
		return rear==front;
	}
	
	/**
	 * 添加数据到队列
	 */
	public void addQueue(int n) {
		
		//判断队列是否满
		if(isFull()) {
			System.out.println("队列满不能加入");
			return;
		}
		
		rear++;
		arr[rear]=n;
	}
	
	/**
	 * 出队列
	 * @return
	 */
	public int getQueue() {
		//判断队列是否空
		if(isEmpty()) {
			//抛出异常
			throw new RuntimeException("队列空，不能取数据");
		}
		
		front++;
		return arr[front];
	}
	
	//显示队列的所有数据
	public void showQueue() {
		//遍历
		if(isEmpty()) {
			System.out.println("队列为空，无法遍历");
			return;
		}
		
		for(int i=0;i<arr.length;i++) {
			System.out.printf("arr[%d]=%d\n",i,arr[i]);
		}
		
	}
	
	//显示队列的头数据，不取数据
	public int headQueue() {
		if(isEmpty()) {
			System.out.println("队列为空，没有数据");
			throw new RuntimeException("队列为空，没有数据");
		}
		
		return arr[front+1];
	}
}